# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
# Contributor: Timo Teräs <timo.teras@iki.fi>
pkgname=emacs
pkgver=28.1
pkgrel=6
pkgdesc="The extensible, customizable, self-documenting real-time display editor"
arch="all"
depends="emacs-nox"
url="https://www.gnu.org/software/emacs/emacs.html"
license="GPL-3.0-or-later"
makedepends="
	autoconf
	automake
	gawk
	gmp-dev
	gnutls-dev
	harfbuzz-dev
	jansson-dev
	linux-headers
	ncurses-dev
	ncurses-libs
	"
subpackages="$pkgname-doc $pkgname-nox"
source="https://ftp.gnu.org/gnu/emacs/emacs-$pkgver.tar.xz
	no-git-repo.patch"

case $CARCH in
	riscv64|s390x)
		# limited by librsvg (rust)
		_docdir="nox"
		;;
	*)
		makedepends="
			$makedepends
			alsa-lib-dev
			fontconfig-dev
			giflib-dev
			glib-dev
			gtk+3.0-dev
			libgccjit-dev
			libjpeg-turbo-dev
			libpng-dev
			librsvg-dev
			libxaw-dev
			libxml2-dev
			libxpm-dev
			pango-dev
			tiff-dev
			"
		subpackages="
			$subpackages
			$pkgname-gtk3
			$pkgname-gtk3-nativecomp:gtk3_nativecomp
			$pkgname-x11
			$pkgname-x11-nativecomp:x11_nativecomp
			"
		_docdir="gtk3"
		;;
esac

prepare() {
	default_prepare
	./autogen.sh
}

_build_variant() {
	cd "$builddir/$1"
	case "$1" in
	x11-nativecomp|gtk3-nativecomp)
		_extra="NATIVE_FULL_AOT=1"
		;;
	esac
	shift
	CFLAGS=-fno-pie \
	LDFLAGS=-no-pie \
	./configure \
		--build=$CBUILD \
		--host=$CHOST \
		--prefix=/usr \
		--sysconfdir=/etc \
		--libexecdir=/usr/lib \
		--localstatedir=/var \
		--with-gameuser=:games \
		--with-gpm \
		--with-harfbuzz \
		--with-json \
		"${@}"

	make $_extra
}

_build_x11() {
	_build_variant x11 \
		--with-x-toolkit=athena \
		--without-toolkit-scroll-bars \
		--without-dbus \
		--with-xft \
		--with-jpeg=yes \
		--with-tiff=yes
}

_build_x11_nativecomp() {
	_build_variant x11-nativecomp \
		--with-x-toolkit=athena \
		--without-toolkit-scroll-bars \
		--without-dbus \
		--with-xft \
		--with-jpeg=yes \
		--with-tiff=yes \
		--with-native-compilation \
		--without-compress-install
}

_build_gtk3() {
	 _build_variant gtk3 \
		--with-x-toolkit=gtk3 \
		--with-xft \
		--with-jpeg=yes \
		--with-tiff=no
}

_build_gtk3_nativecomp() {
	 _build_variant gtk3-nativecomp \
		--with-x-toolkit=gtk3 \
		--with-xft \
		--with-jpeg=yes \
		--with-tiff=no \
		--with-native-compilation
}

_build_nox() {
	_build_variant nox \
		--without-sound \
		--without-x \
		--without-file-notification
}

build() {
	mkdir -p nox
	mv ./* nox || true

	case "$CARCH" in
	riscv64|s390x)
		# limited by librsvg (rust)
		_build_nox
		;;
	*)
		cp -a nox x11
		cp -a nox x11-nativecomp
		cp -a nox gtk3
		cp -a nox gtk3-nativecomp
		_build_nox
		_build_x11
		_build_x11_nativecomp
		_build_gtk3
		_build_gtk3_nativecomp
		;;
	esac
}

package() {
	mkdir -p "$pkgdir"
}

doc() {
	depends=""
	mkdir -p "$subpkgdir"
	cd "$builddir"/"$_docdir"
	make DESTDIR="$subpkgdir" install
	# remove conflict with ctags package
	mv "$subpkgdir"/usr/share/man/man1/ctags.1.gz "$subpkgdir"/usr/share/man/man1/ctags.emacs.1.gz
	# only keep info and man directories, all other is in the specific package
	rm -rf "${subpkgdir:?}"/usr/bin \
		"$subpkgdir"/usr/lib \
		"$subpkgdir"/usr/share/appdata \
		"$subpkgdir"/usr/share/applications \
		"$subpkgdir"/usr/share/emacs \
		"$subpkgdir"/usr/share/icons \
		"${subpkgdir:?}"/var \
		"$subpkgdir"/usr/lib/systemd
}

_subpackage() {
	cd "$builddir/$1"
	make DESTDIR="$subpkgdir" install

	# remove conflict with ctags package
	mv "$subpkgdir"/usr/bin/ctags "$subpkgdir"/usr/bin/ctags.emacs
	rm -rf "$subpkgdir"/usr/share/info \
		"$subpkgdir"/usr/share/man

	# fix user/root permissions on usr/share files
	find "$subpkgdir"/usr/share/emacs/ -exec chown root:root {} \;
	find "$subpkgdir"/usr/lib -perm -g+s,g+x ! -type d -exec chmod g-s {} \;
	# fix perms on /var/games
	chmod 775 "$subpkgdir"/var/games
	chmod 775 "$subpkgdir"/var/games/emacs
	chmod 664 "$subpkgdir"/var/games/emacs/*
	chown -R root:games "$subpkgdir"/var/games

	# remove useless systemd user file
	rm -rf "$subpkgdir"/usr/lib/systemd
}

nox() {
	pkgdesc="$pkgdesc - without X11"
	depends="
		!emacs-gtk3
		!emacs-gtk3-nativecomp
		!emacs-x11
		!emacs-x11-nativecomp
		"
	_subpackage nox
}

x11() {
	pkgdesc="$pkgdesc - with X11"
	depends="
		!emacs-gtk3
		!emacs-gtk3-nativecomp
		!emacs-nox
		!emacs-x11-nativecomp
		desktop-file-utils
		hicolor-icon-theme
		"
	_subpackage x11
}

x11_nativecomp() {
	pkgdesc="$pkgdesc - with X11 and native compilation"
	depends="
		!emacs-gtk3
		!emacs-gtk3-nativecomp
		!emacs-nox
		!emacs-x11
		desktop-file-utils
		hicolor-icon-theme
		"
	_subpackage x11-nativecomp
}

gtk3() {
	pkgdesc="$pkgdesc - with GTK3"
	depends="
		!emacs-gtk3-nativecomp
		!emacs-nox
		!emacs-x11
		!emacs-x11-nativecomp
		desktop-file-utils
		hicolor-icon-theme
		"
	_subpackage gtk3
}

gtk3_nativecomp() {
	pkgdesc="$pkgdesc - with GTK3 and native compilation"
	depends="
		!emacs-gtk3
		!emacs-nox
		!emacs-x11
		!emacs-x11-nativecomp
		desktop-file-utils
		hicolor-icon-theme
		"
	_subpackage gtk3-nativecomp
}

sha512sums="
c146ff7086aba49fa6c18adf4e485a59eb4c6525fddb9d385034446830b8bb0ac9e6fb76e7b6d94a9fddc41643415f36acad57a1ae16a841c97f61bc211459d9  emacs-28.1.tar.xz
5a2d1d10d66fd335b16d9f2d6d1e45e093067db87f8ef2d14a8c921cc94b3e226310c7cc691d19eb91eaf16de9ae4f20ff8be3596a4906b0514fa5f098328d97  no-git-repo.patch
"
